package com.jy.oms.framework.asyn.task.handler;

import com.jy.oms.framework.asyn.task.alarm.AlarmMessage;
import com.jy.oms.framework.asyn.task.alarm.ITaskAlarmMessageService;
import com.jy.oms.framework.asyn.task.alarm.TaskErrorAlarmMessageService;
import com.jy.oms.framework.asyn.task.model.TaskExceedRetryMaxNumDto;
import com.jy.oms.framework.util.SpringUtil;
import org.apache.commons.lang3.StringUtils;

import java.util.Objects;

/**
 * 任务handler，业务实现； 同时需配置@Task注解
 *
 * @author liuquan
 */
public interface ITaskHandler<Param/*参数类型*/, Result/*结果类型*/> {

    String SUCCESS = "success";

    String FAILURE = "failure";

    /**
     * 执行任务
     *
     * @param param 任务参数
     * @return 任务结果
     */
    Result executeTask(Param param) throws Throwable;

    /**
     * 任务执行成功回调处理
     *
     * @param param  任务参数
     * @param result 任务执行的结果
     */
    default void executeTaskCallback(Param param, Result result) throws Throwable {
        //do nothing
    }

    /**
     * 任务执行失败回调处理；
     * 如果任务重试次数大于0，只有当最后一次执行报错时才会执行此回调
     *
     * @param param 任务参数
     */
    default void executeTaskOnFailure(Param param) {
        //do nothing
    }

    /**
     * 任务执行超过最大重试次数时回调处理
     */
    default void exceedRetryMaxNumCallback(TaskExceedRetryMaxNumDto<Param> taskExceedRetryMaxNumDto) {
        TaskErrorAlarmMessageService taskErrorAlarmMessageService = SpringUtil.getBean(TaskErrorAlarmMessageService.class);
        taskErrorAlarmMessageService.alarm((ITaskAlarmMessageService.IMessageConvert<TaskExceedRetryMaxNumDto>) msg -> {
            AlarmMessage alarmMessage = AlarmMessage.create()
                    .title("异步任务报错")
                    .add("任务taskCode", taskExceedRetryMaxNumDto.getTaskCode());
            if (StringUtils.isNotBlank(taskExceedRetryMaxNumDto.getBillNo())) {
                alarmMessage.add("任务billNo", taskExceedRetryMaxNumDto.getBillNo());
            }
            if (StringUtils.isNotBlank(taskExceedRetryMaxNumDto.getUuid())) {
                alarmMessage.add("任务uuid", taskExceedRetryMaxNumDto.getUuid());
            }
            if(taskExceedRetryMaxNumDto.getExceptionType() != null){
                alarmMessage.add(Objects.equals(taskExceedRetryMaxNumDto.getExceptionType(), 1) ? "业务异常" : "系统异常", taskExceedRetryMaxNumDto.getExceptionTitle());
            }

            return alarmMessage;
        }, taskExceedRetryMaxNumDto);
    }
}
